﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entity;
using Business;

namespace CPEBookWeb
{
    public class ActualiteView
    {

        // Classes CSS
        private const string cssTable = "murTable";
        private const string cssTdIdentite = "murTdIdentite";
        private const string cssTdIdentiteLien = "murTdIdentiteLien";
        private const string cssTdStatut = "murTdStatut";
        private const string cssTdStatutText = "murTdStatutText";
        private const string cssTdStatutDate = "murTdStatutDate";
        private const string cssTdAime = "murTdAime";
        private const string cssTdAimeImage = "murTdAimeImage";
        private const string cssTdCommentaire = "murTdCommentaire";
        private const string cssTdCommentaireText = "murTdCommentaireText";
        private const string cssTdCommentaireDate = "murTdCommentaireDate";
        private const string cssTdCommentaireLien = "murTdCommentaireLien";
        private const string cssTdCommenter = "murTdCommenter";
        private const string cssTdCommenterTextBox = "murTdCommenterTextBox";
        private const string cssTdCommenterBouton = "murTdCommenterBouton";

        /// <summary>
        /// L'actualité à afficher.
        /// </summary>
        public Actualite Actualite { get; set; }

        /// <summary>
        /// L'utilisateur voulant afficher l'actualité.
        /// </summary>
        public Utilisateur Utilisateur { get; set; }

        /// <summary>
        /// Handler écoutant les clics sur "J'aime"
        /// </summary>
        public EventHandler EcouteurJaime { get; set; }

        /// <summary>
        /// Handler écoutant les clics sur "Commenter"
        /// </summary>
        public EventHandler EcouteurCommenter { get; set; }


        /// <summary>
        /// Génère une table pour l'actualité.
        /// La table générée contient le statut, les commentaires et les "J'aime".
        /// </summary>
        /// <returns>Le composant Table correspondant à l'actualité</returns>
        public Table getTableActualite() {
		
			// Création de la table
			Table table = new Table();
            table.CellSpacing = 0;
            table.CellPadding = 0;
			table.CssClass = cssTable;
            
			// Objets réutilisés pour chaque ligne
			TableCell tdGauche = null;
			TableCell tdDroite = null;
			
			// Première ligne, colonne de gauche : identité de l'auteur
			tdGauche = new TableCell();
            tdGauche.CssClass = cssTdIdentite;
			ajouterCodeIdentite(tdGauche);
			
			// Première ligne, colonne de droite : le statut
			tdDroite = new TableCell();
            tdDroite.CssClass = cssTdStatut;
            ajouterCodeStatut(tdDroite);
			
			// On ajoute la ligne à la table
			ajouterLigne(table, tdGauche, tdDroite);
			
			// Seconde ligne : les "J'aime"
			tdDroite = new TableCell();
			tdDroite.CssClass = cssTdAime;
			ajouterCodeJaime(tdDroite);
			
			// On ajoute la ligne à la table
			ajouterLigne(table, null, tdDroite);
			
			// Lignes suivante : Liste des commentaires
            if (Actualite.Commentaires != null)
            {
                foreach (CommentaireUtilisateur commentaire in Actualite.Commentaires)
                {
					// On génère une nouvell cellule
					tdDroite = new TableCell();
					tdDroite.CssClass = cssTdCommentaire;
                    ajouterCodeCommentaire(tdDroite, commentaire);
					
					// On ajoute la ligne à la table
					ajouterLigne(table, null, tdDroite);
                }
            }
			
			// Dernière ligne : Formulaire pour commenter
			tdDroite = new TableCell();
            tdDroite.CssClass = cssTdCommenter;
            ajouterCommenterCode(tdDroite);
			
			// On ajoute la ligne à la table
			ajouterLigne(table, null, tdDroite);

            // Enfin on retourne la table
            return table;
		}


        // Ajoute une ligne à la table
        private void ajouterLigne(Table table, TableCell tdGauche, TableCell tdDroite)
        {
            TableRow tr = new TableRow();
            tr.Cells.Add((tdGauche != null) ? tdGauche : new TableCell());
            tr.Cells.Add((tdDroite != null) ? tdDroite : new TableCell());
            table.Rows.Add(tr);
        }


        // Retourne un lien vers le profil utilisateur
        private HyperLink creerLienProfil(Utilisateur utilisateur)
        {
            HyperLink lien = new HyperLink();
            lien.NavigateUrl = "Profil.aspx?id=" + utilisateur.idutilisateur.ToString();
            lien.Text = utilisateur.prenom + " " + utilisateur.nom;
            return lien;
        }


        // Ajoute le contenu à la cellule contenant l'identité du posteur
        private void ajouterCodeIdentite(TableCell td)
        {
            // Raccourci
            Utilisateur utilisateur = Actualite.Utilisateur;

            // On ajoute un lien à la cellule
            HyperLink lien = creerLienProfil(utilisateur);
            lien.CssClass = cssTdIdentiteLien;
            td.Controls.Add(lien);
        }


        // Ajoute le contenu à la cellule contenant le statut
        private void ajouterCodeStatut(TableCell td)
        {
            // Raccourci
            Statut statut = Actualite.Statut;

            // On génère la chaine
            string date = "Le " + statut.date.ToString("dd/MM/yyyy") + " à " + statut.date.ToString("HH:mm");
            string code = "<div class=\"" + cssTdStatutText + "\">" + Outils.formaterMessage(statut.texte) + "</div>\n";
            code += "<div class=\"" + cssTdStatutDate + "\">" + date + "</div>\n";

            // On l'ajoute à la cellule
            td.Controls.Add(new LiteralControl(code));
        }


        // Ajoute le contenu à la cellule contenant les "J'aime"
        private void ajouterCodeJaime(TableCell td) {

            // Raccourci
            Statut statut = Actualite.Statut;

            // Icône "J'aime"
            Image image = new Image();
            image.CssClass = cssTdAimeImage;
            image.ImageUrl = "";
            td.Controls.Add(image);

            // On regarde si l'utilisateur aime le statut
            if (ActualiteService.utilisateurAimeStatut(statut.idstatut, Utilisateur.idutilisateur))
			{
				// L'utilisateur à déjà cliqué sur "J'aime", on l'affiche
                td.Controls.Add( new LiteralControl("Vous aimez") );
			}
            else
            {
				// Sinon on créer le lien "J'aime"
				LinkButton lien = new LinkButton();
                lien.Text = "J'aime";
                lien.ID = "LinkBtnAime_" + statut.idstatut.ToString();
                lien.CommandName = "aimer";
                lien.CommandArgument = statut.idstatut.ToString();
                if( EcouteurJaime != null)
                    lien.Click += EcouteurJaime;
                td.Controls.Add(lien);
            }

			// On formatte une chaine indiquant combien de personne aiment
            String textAime;
            int nbAime = Actualite.nbAime;
			string nbAimeTxt = Actualite.nbAime.ToString();
            if (nbAime == 0)
                textAime = "Personne n'aime ça";
            else if (nbAime == 1)
                textAime = nbAimeTxt + " personne aime ça";
            else
                textAime = nbAimeTxt + " personnes aiment ça";

			// Séparation
			textAime = " - " + textAime;

			// On ajoute à la suite
			td.Controls.Add( new LiteralControl(textAime) );
		}


        // Ajoute le contenu à la cellule d'un commentaire
        private void ajouterCodeCommentaire(TableCell td, CommentaireUtilisateur commentaireUtilisateur)
        {

            // Raccourci
            Utilisateur utilisateur = commentaireUtilisateur.Utilisateur;
            Commentaire commentaire = commentaireUtilisateur.Commentaire;

            // Ajout du lien vers le profil utilisateur
            HyperLink lien = creerLienProfil(utilisateur);
            lien.CssClass = cssTdCommentaireLien;
            td.Controls.Add(lien);

            // On génère le code du commentaire et de la date
            string date = "Le " + commentaire.date.ToString("dd/MM/yyyy") + " à " + commentaire.date.ToString("HH:mm");
            string code = "<span class=\"" + cssTdCommentaireText + "\">" + Outils.formaterMessage(commentaire.texte) + "</span>\n";
            code += "<div class=\"" + cssTdCommentaireDate + "\">" + date + "</div>\n";

            // Ajout à la suite
            td.Controls.Add(new LiteralControl(code));
        }


        // Ajoute le contenu à la cellule d'un commentaire
        private void ajouterCommenterCode(TableCell td)
        {
            // Raccourci
            Statut statut = Actualite.Statut;

            // Champs de texte
            TextBox tb = new TextBox();
            tb.ID = "TextCommentStatut_" + statut.idstatut.ToString();
            tb.CssClass = cssTdCommenterTextBox;

            // Bouton
            Button btn = new Button();
            btn.ID = "BtnCommentStatut_" + statut.idstatut.ToString();
            btn.Text = "Commenter";
            btn.CommandName = "commenter";
            btn.CommandArgument = statut.idstatut.ToString();
            if (EcouteurCommenter != null)
                btn.Click += EcouteurCommenter;
            btn.CssClass = cssTdCommenterBouton;

            // On ajoute à la cellule
            td.Controls.Add(tb);
            td.Controls.Add(btn);
        }

    }
}
